/*** Win32Demo

*/        
// #include "DrvMain.h"
// #include <SDL2/SDL.h> 

// #include "DrvFIFO.h"
// #include "W32_File.h"

#include "basic_api.h"
#include "Win32_Uart.h" 
#include "Win32UartApp.h" 


/*** Interior Define */

#define LLOG_ERR
#define LLOG_MARK
#define LLOG
#include "llog.h"

/*** Interior Struct */

/*** Global Data */

/*** Local Function Define*/

//========================//

#ifdef CFG_WIN32_UART_APP		/*** Comlist 更新 and 打印 */

static uint8_t g_SerialPort[SERIAL_PORT_CHECK_MAXNUM];	// 记录系统的com端口
static uint8_t g_SerialPortNum;

static void Show_SerialPortList(void){
	int i;
	// uint8_t* pBuf = &g_SerialPort[0];
	LLOG("\nComPort List\n");	//
	LLOG("#I Active SerialPortNum=[%d]\n",g_SerialPortNum);
	for(i=0;i<g_SerialPortNum;i++){
		LLOG("%d COM%d\n",i,g_SerialPort[i]);
	}	
}

static void SerialPortList_Updata(void){
	g_SerialPortNum = Serial_CheckAndListPort(sizeof(g_SerialPort),&g_SerialPort[0]);
}

uint8_t SerialPortList_UpdataAndShow(void){
	SerialPortList_Updata();
	Show_SerialPortList();
	return g_SerialPortNum;
}

uint8_t SerialPort_GetActiveNum(void){
	return g_SerialPortNum;
}

int Check_ComNum_IsActive(uint8_t ComNum){
	
	int ret=RET_ERR;
	int i;
	for(i=0;i<g_SerialPortNum;i++){
		if(g_SerialPort[i] == ComNum){
			ret=RET_OK;
			break;
		}
	}
	return ret;
}

#endif

#ifdef CFG_GET_UART_PARA 		/*** 获取 uartPara 流程*/
 
static uint32_t DecStrToU32(uint8_t* pStr){ // 类似 atoi
	
	uint32_t tmp32;
	uint32_t tmp;
	int i;

	tmp32=0;
	i=0;
	while(pStr[i]!=0x00 && (i<10)){
		tmp=pStr[i++];
		// 
		if( ('0'<= tmp) && (tmp <='9')){
			tmp-='0';
		}
		else{ // Err
			LLOG_ERR();
			tmp32=0;
			break;
		}
		tmp32*=10;
		tmp32+=tmp;
	}	
	return tmp32;
}

static int LineToStr(uint8_t* pLine){
	// 将行 转换为 字符串
	//'\n' 10 换行LF（newline） '\r' 13 回车CR（return）
	int i=0;
	for(i=0;;i++){
		if(pLine[i]=='\n'){
			pLine[i] = 0;
			i++;
			break;
		}
		
		if(i>1000){ // 超出合理范围 退出
			i = 0;
			break;
		}
	}
	return i;
}

int W32Uart_GetPara_Sequence(uint8_t* pComNum,int* pBaudRate){ // bash 交互
	// N-Bash交互输, 入关键参数 ; 返回关键输入参数值; 
	
	int ret=RET_ERR;
	uint8_t 	ComNum;
	int 		BaudRate;
	uint32_t	Tmp32;
	char PortName[10] = {0};
	char PortRate[10] = {0};
	
	LLOG("\nOpen ComPort\n");
	//
	SerialPortList_UpdataAndShow();
	
	//  TODO: 对输入参数处理进行优化
	LLOG("Input ComNum(1)>> ");
    fgets(PortName,256,stdin);	// 暂停并等待输入 //注意： 结尾多了一个0x0A!!
	
	LineToStr(&PortName[0]);
	Tmp32=DecStrToU32(&PortName[0]);
	ComNum=Tmp32&0xFF;
	if(ComNum == 0){
		// LLOG("ComNum[%d] Tmp32[%d]\n",ComNum,Tmp32);
		LLOG("Input String Err ");
		Log_ShowArray("Input",sizeof(PortName),&PortName[0]);
		return ret;
	}
	
	#if 0 
	DBG("\nInput BaudRate >> ");
    fgets(PortRate,256,stdin);	// 暂停并等待输入 //注意： 结尾多了一个0x0A!!	
	LineToStr(&PortRate[0]);
	Tmp32=DecStrToU32(&PortRate[0]);
	
	BaudRate=(int)Tmp32;
	if(BaudRate < 9600){
		LLOG("Input BaudRate Err\n");
		Log_ShowArray("Input",sizeof(PortRate),&PortRate[0]);
		return ret;
	}
	#else // 默认波特率
		BaudRate = 500000; // 500K
	#endif

	ret=RET_OK;
	
	*pComNum=ComNum;
	*pBaudRate=BaudRate;
	
	return ret;
}

#endif

#ifdef CFG_WIN32_UART_APP 		/*** Rx Port */

static uint8_t g_Flag_UartRx_ShowFormat = 0;
static int (*g_pPtcl_RecognizerAndProcess)(uint8_t ch);

int W32UartApp_BindCBF(int (*pFunc)(uint8_t ch)){
	
	int ret=RET_OK;	
	g_pPtcl_RecognizerAndProcess = pFunc;
	return ret;
}

int AppTask_W32Uart_Rx(void* pPara){ // 接收信息打印 
	// 	使用这个简单形式的 接收处理 程序 结构
	// 因为 win32 环境下有足够的算力
	int ret=RET_ERR;
	int RLen;
	uint8_t RBuf[50];
	uint8_t i;

	RLen = Win32_Comm_GetPkg(sizeof(RBuf),&RBuf[0]);
	if(RLen > 0){
		// LLOG_MARK();
		for(i=0;i<RLen;i++){
			if(g_pPtcl_RecognizerAndProcess != NULL){
				g_pPtcl_RecognizerAndProcess(RBuf[i]);
			}
		}
		
		#if 1 // fordebug 接收数据 打印| 回显
		if(g_Flag_UartRx_ShowFormat == 1){
			Log_ShowArray("W32Rx",RLen,&RBuf[0]);
		}
		else if(g_Flag_UartRx_ShowFormat == 2){
			for(i=0; i<RLen; i++){
				LLOG("%c",RBuf[i]);
			}
		}
		#endif
	}
	return ret;
}

#endif

#ifdef CFG_WIN32_UART_APP 		/*** 启用 UartApp */

// extern unsigned char g_arg_ComNum ;			// Form Main arg 
// extern unsigned long g_arg_Baudrate ;
// extern unsigned char g_arg_HexShowFlag ;
// extern char* g_arg_pFileName ;

int Win32_Uart_App_Init(uint8_t ComNum,int BaudRate,uint8_t RxShowFlag)
// int Win32_Uart_App_Init(void)
{
	int ret = RET_ERR;
	// uint8_t ComNum;
	// int BaudRate;	

	g_pPtcl_RecognizerAndProcess = NULL;
	//			
	// ComNum				= ComNum;
	// BaudRate			= BaudRate;	
	g_Flag_UartRx_ShowFormat	= RxShowFlag;
	
	// SerialPortList_Updata();
	
	ret = Check_ComNum_IsActive(ComNum);		
	if(ret==RET_ERR)	{ LLOG_ERR(); return ret;}
	// 
	ret = Win32_Comm_Init(ComNum,BaudRate);
	if(ret != RET_OK)		{ LLOG_ERR(); return ret;}			
	
	ret = RET_OK;
	
	LLOG_MARK();
	// ret = App_ASchTask_Add(0,AppTask_W32Uart_Rx,10,10,NULL);
	// Note : 不需要 TxTask , 已经有相应机制;
	
	// Exit
	// Win32_Comm_Close();
	
	return ret;
}

#endif

/* static int UTTask_W32Uart_PeriodSend(void* pPara){ // for test 
	
	static uint32_t MTick;
	int ret=RET_ERR;
	uint8_t TestStr[]="UartDrv Test!\n";
	if(RET_OT != If_TimeOut(MTick,1000)){
		// 数据接收处理？				
		return ret;
	}
	ret=RET_OK;
	MTick=GetNowTick();
	Win32_Comm_SendPkg(sizeof(TestStr)-1,&TestStr[0]);
	return ret;

} */



